Skip to content

在程序调试以及运行过程中 Log 都是分析程序运行的重要部分。本文记录了pythonlogging库的使用方法。

前言

logging提供了方便的日志输出接口,可以指定将日志输出到控制台或者保存到文件,并提供了5种不同的输出日志输出等级:DEBUG<INFO<WARNING<ERROR<CRITICAL,可以为不同的输出方式(文件、控制台)等指定不同的输出等级,只有大于等于输出等级的日志才会被显示出来。

Logging中包含了4个重要的对象

  • Logger log操作的主要对象
  • Handler 日志保存到地方(可以是控制台或者一个文件),一个 logger可以包括多个Handler
  • Filter 过滤日志的方法
  • Formatter 指定日志输出的格式,可以为每个Handler单独指定不同的Formatter

常见使用方法

python
import sys, logger
# 获取一个logger对象,可以指定logger 的名字,这个名字可以用来区分不同的logger输出
logger = logging.Logger('AmazeballsLogger')

# 设置log控制台的输出,指定为sys.stdout,默认值是sys.stderr
sh = logging.StreamHandler(sys.stdout)
# 添加控制台输出Handler到Logger
logger.addHandler(sh)
# 设置log输出到一个文件
fh = logging.FileHandler("/path/to/file.log", 'w+')

# 添加文件输出Handler到Logger
logger.addHandler(sh)

# 指定全局输出的格式
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
logger.handler.setFormatter(formatter)

Logger初始化完毕后就可以使用logger提供的接口输出日志信息了,具体的使用方法为:

python
logger.critical("critical")
logger.error("error")
logger.warning("warning")
logger.info("info")
logger.debug("debug")

指定输出等级

当我们有一些信息只想保存在log文件但是不想显示在控制台中时,可以设置不同输出HandlerLevel属性达到目的。

python
# 先设置全局的输出等级为最低,否则默认全局的最低输出等级是 WARNING,后面的设置都不会生效
logger.setLevel(logging.DEBUG)

# 设置控制台的日志输出等级,只有大于 WARNING 等级的日志会被输出到控制台
sh.setLevel(logging.WARNING)
logger.addHandler(sh)

# 设置文件的日志输出等级,只有大于 DEBUG 等级的日志会被保存到文件
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)

设置完成后执行

python
logger.critical("critical")
logger.error("error")
logger.warning("warning")
logger.info("info")
logger.debug("debug")

控制台输出

shell
2020-04-13 17:52:57,729 - CRITICAL - critical
2020-04-13 17:52:57,731 - ERROR - error
2020-04-13 17:52:57,734 - WARNING - warning

文件输出

shell
2020-04-13 17:52:57,729 - CRITICAL - critical
2020-04-13 17:52:57,731 - ERROR - error
2020-04-13 17:52:57,734 - WARNING - warning
2020-04-13 17:52:57,734 - INFO - info
2020-04-13 17:52:57,734 - DEBUG - debug

设置输出格式

可以使用不同的占位符设置log的显示日志

python
# %(asctime)s 输出时间,String
# %(filename)s 输出日志的源文件文件名,String
# %(lineno)d 输出日志的源文件所在文件的行数, Decimal
# %(levelname)s 输出等级, String
# %(message)s" 输出信息内容 String

# 可以使用
formatter = logging.Formatter("[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s")
logger.handler.setFormatter(formatter)

# 单独指定不同 Handler 的输出格式
fh.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))

最新更新: